package com.martini.satoken01.service.system;

import com.martini.satoken01.entity.SysUser;
import com.martini.satoken01.model.domain.OnlineInfoDO;

import java.util.List;

/**
 * 用户服务
 *
 * @author martini at 2021/12/18 22:39
 */
public interface UserService {

    /**
     * 邮箱校验的缓存key
     *
     * @param obj 用户主体
     * @return key
     */
    static String getEmailValidationKey(Object obj) {
        return String.format("user:validation:email:%s", obj);
    }

    /**
     * 二维码登录的key
     *
     * @param key 随机字符
     * @return key
     */
    static String getQrLoginInfoKey(String key) {
        return String.format("user:login:qr:%s", key);
    }

    /**
     * 在线信息获取的key
     *
     * @param loginId 登录id
     * @return 在线信息获取key
     */
    static String getOnlineInfoKey(Long loginId) {
        return String.format("user:online:%s", loginId);
    }

    /**
     * 根据用户名查找系统用户
     *
     * @param username 用户名
     * @return {@link SysUser}
     */
    SysUser findUserByUsername(String username);

    /**
     * 保存用户
     *
     * @param sysUser 用户信息
     * @return 是否保存成功
     */
    boolean addUser(SysUser sysUser);

    /**
     * 根据邮箱查找系统用户
     *
     * @param email 邮箱
     * @return {@link SysUser}
     */
    SysUser findUserByEmail(String email);

    /**
     * 根据账号id查找系统用户
     *
     * @param id 用户id
     * @return {@link SysUser}
     */
    SysUser findUserById(long id);

    /**
     * 发送验证邮件
     *
     * @param loginId 登录id
     * @return 是否发送成功
     */
    boolean sendValidationEmail(long loginId);

    /**
     * 校验邮箱验证码
     *
     * @param loginId 登录id
     * @param code 验证码
     * @return 是否校验成功
     */
    boolean checkEmailValidationCode(long loginId, String code);

    /**
     * 通过主键更新用户非空属性
     *
     * @param sysUser 用户实体类
     * @return 是否更新成功
     */
    boolean updateByPrimaryKeySelective(SysUser sysUser);

    /**
     * 设置在线信息
     *
     * @param onlineInfoDO 在线信息
     * @return 操作成功
     */
    boolean online(OnlineInfoDO onlineInfoDO);

    /**
     * 根据用户的登录id获取用户在线信息
     *
     * @param loginId 登录id
     * @return {@link OnlineInfoDO}
     */
    List<OnlineInfoDO> getOnlineInfo(Long loginId);

    /**
     * 设置离线信息
     *
     * @param loginId 登录id
     * @param device 设备名称
     * @return 操作成功
     */
    boolean offline(Long loginId, String device);
}
